package com.dao;

import java.util.Set;
import com.hbt.HibernateUtil;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.bean.Cliente;
import com.bean.IdRodamiento;
import com.bean.Rodamiento;


public class RodamientoDAO {
	private static RodamientoDAO instancia = null;
	private static SessionFactory sf = null;

	
	public static RodamientoDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new RodamientoDAO();
		} 
		return instancia;
	}
	
	public void grabarRodamientos(Set <Rodamiento> rodamientos){
		Session session = sf.openSession();
		session.beginTransaction();
		for(Rodamiento rod : rodamientos){
			session.save(rod);
		}
		session.getTransaction().commit();
		session.close();
	}
	
	public void grabarRodamiento(Rodamiento rod){
		Session session = sf.openSession();
		session.beginTransaction();
		session.save(rod);
		session.getTransaction().commit();
		session.close();
	}
	
	
	public Rodamiento getRodamiento(Rodamiento rod) {
		Session session = sf.openSession();
		Rodamiento rodamiento = (Rodamiento) session.get(Rodamiento.class, rod.getId());
		session.close();
		return rodamiento;
	}


	public Double getMejorPrecioRodamiento(Rodamiento rod) {
		Session session = sf.openSession();
		Double mejorPrecioProveedor = (Double) session.createQuery("SELECT MIN(item.precio) FROM itemListaPrecio item "+
																"WHERE item.codigo= :codigo")
		
		.setString("codigo", rod.getCodigo())
		.setFirstResult(0)
		.setMaxResults(1)
		.uniqueResult();
		session.close();
		return mejorPrecioProveedor;
	}

	
	public void actualizarRodamiento(Rodamiento rodamiento) {
		try{
			
			Session session = sf.openSession();
			Query query = session.createQuery("update Rodamiento rod " +
					"set caracteristica = :caracteristica, " +
					"tipo = :tipo, " +
					"origen = :origen, " +
					"precio = :precio, " +
					"stock = :stock " +
					"where codigo = :codigo and marca =:marca");
			
			query.setParameter("caracteristica", rodamiento.getCaracteristica());
			query.setParameter("tipo", rodamiento.getTipo());
			query.setParameter("origen", rodamiento.getOrigen());
			query.setParameter("precio", rodamiento.getCosto());
			query.setParameter("stock", rodamiento.getStock());
			query.setParameter("marca", rodamiento.getMarca());
			query.setParameter("codigo", rodamiento.getCodigo());
			query.executeUpdate();
			session.close();
			
		}catch (Exception e) {
			System.out.println(e.getMessage());
		}	
	}

	public void bajaRodamiento(String codigo, String marca) {
		Session session = null;
		
		try{
			session = sf.openSession();	
			session.beginTransaction();
			//Query query = session.createQuery("Delete Rodamiento r where " +
			//		"r.codigo = :codigo and r.marca = :marca").setString("codigo", codigo).setString("marca", marca);
			//query.executeUpdate();		
			IdRodamiento id = new IdRodamiento (codigo, marca);
			Rodamiento rod = (Rodamiento) session.get(Rodamiento.class, id);
			session.delete(rod);
			session.getTransaction().commit();
			session.close();		
		}catch (HibernateException e) {
			System.out.println("Imposible eliminar. Rodamiento en uso.");
			if (session != null)
				session.close();
		}
		
	}
	
}
